package futbol.tacticas.concursantes2007.TinoTeam;

import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;

import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;

public class TinoTeam implements Tactica{

	private int nValores[][]={
	       			
			 {-160,0,6},  // Jugador 1[0] 
		     {-110,-60,7},  // Jugador 2[1] 
		     {-110,0,7},  // Jugador 3[2] 
		     {-110,60,7},  // Jugador 4[3] 
		     {-65,-80,5},  // Jugador 5[4]
		     {-65,80,5},  // Jugador 6[5]
		     {-35,5,6},  // Jugador 7[6]
		     {0,55,4},  // Jugador 8[7]
		     {50,0,5},  // Jugador 9[8]
		     {85,-35,6},  // Jugador 10[9]
		     {130,30,6}   // Jugador 11[10] 
	    };
	    
	    public Color getColor1() {
	        return Color.darkGray;
	    }

	    public Color getColor2() {
	        return Color.darkGray;
	    }

	    public Color getColorNumero() {
	        return Color.white;
	    }

	    public String getNombre() {
	        return "Tino Team";
	    }

	    public int getXInicial(int n) {
	        return nValores[n][0];
	    }

	    public int getYInicial(int n) {
	        return nValores[n][1];
	    }

	    public int getFuerza(int n) {
	        return nValores[n][2];
	    }

	    public Vector<Comando> getComandos(SituacionJugadores sj) {
	        Vector<Comando> com = new Vector();
	        
	        //Posicionamiento
	        for (int n=0;n<11;n++)
	            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));

	        Point bola=sj.getBola();
	        Point jugadores[]=sj.getMisJugadores();
	        Point contrarios[]=sj.getContrario();	        
	       
	        //cubro a los contrarios mientras la bola no est en mi poder
	        //los defensas son los que cubren (2 - 4)
	        if(!sj.estoyMasCercaDeBola() || bola.getX() > -85) 
	        {	        			        	  
			     for(int i=1;i<5;i++){
			        //Obtengo el dorsal del jugador contrario ms cercano a cada uno de los defensas
			        //y los marca adelantndose 10 unidades
					int nJC=sj.getContrarioMasCerca(getXInicial(i) + 5, getYInicial(i));
				    com.add(new ComandoIrA(sj.getMiJugadorMasCerca(contrarios[nJC].getX(), contrarios[nJC].getY()), contrarios[nJC].getX()+ 10, contrarios[nJC].getY()));
			     }	        	  
			}
	       
	        //la bola est en mi campo, cerca del rea, posible jugada de peligro
	        if(sj.estoyMasCercaDeBola() && bola.getX() < -85 &&
	          (sj.getMasCercanoDeBola() == 2 
	   	    || sj.getMasCercanoDeBola() == 3 
	   		|| sj.getMasCercanoDeBola() == 4 ))//es alguno de los defensores
	        {	        		
	        	//mi jugador ms cercano a la bola va hacia ella
	        	com.add(new ComandoIrA(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()), sj.getBola().getX(), sj.getBola().getY()));
	        	
	        	//paso la bola al siguiente jugador
	        	com.add(new ComandoPase(sj.getMiJugadorMasCerca(bola.getX(), bola.getY()),sj.getSiguienteJugador(sj.getMiJugadorMasCerca(bola.getX(), bola.getY()))));
	        	//com.add(new ComandoPase(sj.getMasCercanoDeBola(),sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY())));
	        }
	        	
	        if (bola.getX() <= -145 && sj.getMasCercanoDeBola() == 1) //es el portero
        	{
	        	//el portero va hacia la bola
	        	com.add(new ComandoIrA(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()),sj.getBola().getX(), sj.getBola().getY()));
        			
	        	//despeja la bola
	        	com.add(new ComandoTiroAPuerta(0,3));
        	}
	        
	        //Repliego al portero y la defensa en caso de que se adelanten demasiado
	        if( jugadores[0].getX() > getXInicial(0) 
	         ||	jugadores[2].getX() > getXInicial(2) + 50
	         || jugadores[3].getX() > getXInicial(3) + 50
	         || jugadores[4].getX() > getXInicial(4) + 50)
	        {
	        	for(int i=0; i<4; i++)
	        	{		        						        	
	        		com.add(new ComandoIrA(i, getXInicial(i), getYInicial(i)));
				}
	        }      
	        
	        //Los delanteros no pueden bajar del medio campo
	        if( jugadores[8].getX() < 0
	   	     || jugadores[9].getX() < getXInicial(9) - 30
	   	     || jugadores[10].getX() < getXInicial(10) - 20)
	   	        {
	   	        	for(int i=8; i<=10; i++)
	   	        	{		        						        	
	   	        		com.add(new ComandoIrA(i, getXInicial(i), getYInicial(i)));
	   				}
	   	        }
	        
	        //si la bola est por el centro del campo, los jugadores la juegan hasta
	        //que se pueda hacer un pase en condiciones
	        if(bola.getX() >= -65 && bola.getX()<65 )
	        {
	        	if(sj.getMasCercanoDeBola() == 7
		   		|| sj.getMasCercanoDeBola() == 8)
	        	{
	        		if (libreDeMarca(sj,sj.getMasCercanoDeBola()) == 9)
	        		{
	        			com.add(new ComandoPase(sj.getMasCercanoDeBola(),9));
	        		}
	        		if (libreDeMarca(sj,sj.getMasCercanoDeBola()) == 10)
	        		{
	        			com.add(new ComandoPase(sj.getMasCercanoDeBola(),10));
	        		}
	        		
	        		
	        		
	        		//Si ninguno de los delanteros est desmarcado, se adelanta el siguiente jugador y se
	        		//le pasa el baln
	        		com.add(new ComandoIrA(sj.getMasCercanoDeBola() + 1,getXInicial(sj.getMasCercanoDeBola() + 1) + 40,getYInicial(sj.getMasCercanoDeBola() + 1) + 40));
	        		
	        		//se le pasa el baln al jugador desmarcado
	        		com.add(new ComandoPase(sj.getMasCercanoDeBola(),sj.getMasCercanoDeBola() + 1));   		
	        	}
	        }
	        
	        if(sj.getMasCercanoDeBola() == 5)
	        {
	        	//Si ninguno de los delanteros est desmarcado, se adelanta el siguiente jugador y se
        		//le pasa el baln
        		com.add(new ComandoIrA(10,getXInicial(10) + 25,getYInicial(10) - 50));
        		
        		//se le pasa el baln al jugador desmarcado
        		com.add(new ComandoPase(5,10));
	        }
	   	    
	        if(sj.getMasCercanoDeBola() == 6)
	        {
	        	//Si ninguno de los delanteros est desmarcado, se adelanta el siguiente jugador y se
        		//le pasa el baln
        		com.add(new ComandoIrA(8,getXInicial(8) + 25,getYInicial(8) + 50));
        		
        		//se le pasa el baln al jugador desmarcado
        		com.add(new ComandoGolpearBola(6,jugadores[8].getX(),jugadores[8].getY()));
	        }
	        /******************************************/
	        if( sj.getMasCercanoDeBola() == 8 )// == 7 && bola.getX() > 50)
	   	   	{
	        	if( (libreDeMarca(sj, 8)) == 9 || (libreDeMarca(sj, 8)) == 10)
	        	{
	        		com.add(new ComandoIrA(9, getXInicial(9) + 5, getYInicial(9) - 8));
	  	        	com.add(new ComandoIrA(10, getXInicial(10) + 10, getYInicial(10) + 5));
	  	        	
	  	        	if( (libreDeMarca(sj, 8)) == 9)
		        	{
		        		com.add(new ComandoPase (8,9));
		        		com.add(new ComandoIrA(9,bola.getX(),bola.getY()));
		        	}
		        	else if( (libreDeMarca(sj, 8)) == 10)
		        	{
		        		com.add(new ComandoPase (8,10));
		        		com.add(new ComandoIrA(10,bola.getX(),bola.getY()));
		        	}
	        	}
	          	else
	        	{
	        		com.add(new ComandoPase (8,libreDeMarca(sj, 8)));
	        	}
	   	   		
	   	   	}
	        else
	        {
	        	com.add(new ComandoPase (8,sj.getSiguienteJugador(8)));
	        }
	        
	        /*if( !sj.estoyMasCercaDeBola() && bola.getX() > 70 && //desmarque
	  	         ( sj.getMasCercanoDeBola() == 9 
	  	   		|| sj.getMasCercanoDeBola() == 10 ))//es alguno de los delanteros
	  	        {	        		
	  	        	//mi jugador ms cercano a la bola va hacia ella
	  	        	com.add(new ComandoIrA(9, getXInicial(9) + 5, getYInicial(9)));
	  	        	com.add(new ComandoIrA(10, getXInicial(9) + 10, getYInicial(9))); 
	  	        }*/
	        
	        if( sj.estoyMasCercaDeBola() && bola.getX() > 110 && 
		  	         ( sj.getMasCercanoDeBola() == 9 
		  	   		|| sj.getMasCercanoDeBola() == 10 ))//es alguno de los delanteros
		  	        {	        		
	        			//mi jugador ms cercano a la bola va hacia ella
	        			com.add(new ComandoIrA(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()), sj.getBola().getX(), sj.getBola().getY()));
	        			lanzarBolaMejor(sj, com);        			
		  	        }
	        
	        if(sj.estoyMasCercaDeBola() && bola.getX() < 125 &&
	          (sj.getMasCercanoDeBola() == 5 
	        || sj.getMasCercanoDeBola() == 6 
	        || sj.getMasCercanoDeBola() == 7
	        || sj.getMasCercanoDeBola() == 8))
	        //|| sj.getMasCercanoDeBola() == 9
	        //|| sj.getMasCercanoDeBola() == 10))
	        {
	        	com.add(new ComandoIrA(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()), sj.getBola().getX(), sj.getBola().getY()));
	        	com.add(new ComandoPase(sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()) , libreDeMarca(sj,sj.getMiJugadorMasCerca(sj.getBola().getX(), sj.getBola().getY()))));
	        	
	        	if(bola.getX() > 105)
	        	{
	        		com.add(new ComandoTiroAPuerta(sj.getMasCercanoDeBola(),15));;
	        	}
	        }
	        	

	        //Movimiento portero
	        int y=(int)(bola.getY()/2);
	        if (y<-20) y=-25;
	        if (y>20) y=25;
	        com.add(new ComandoIrA(0,nValores[0][0], y));
	        
	        //Movimiento mas cercano a la bola
	        int nJug=sj.getMasCercanoDeBola();
	        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));

	        lanzarBolaMejor(sj, com);
	        
	        return com;
	    }	
	    
	    //private desmarcar(SituacionJugadores sj,)   
	    
	    //Devuelve el jugador desmarcado ms cercano al que se la pasa como parmetro 
	    private int libreDeMarca(SituacionJugadores sj,int j)
	    {
	    	//Point bola=sj.getBola();
	        Point jugadores[]=sj.getMisJugadores();
	        //Point contrarios[]=sj.getContrario();
	        int distancia;
	        int a=10;
	        if(j>=4)
	        {
	        	for(int i = j; i<11; i++)
		    	{
		    		distancia = (int)General.getDistancia(jugadores[i].getX(),jugadores[i].getY(),sj.getContrarioMasCerca(jugadores[i].getX(), jugadores[i].getY()), sj.getContrarioMasCerca(jugadores[i].getX(), jugadores[i].getY())); 
		    		if(distancia > 2 )
		    		{
		    			if(i == 8  || i == 9 || i == 10)
		    				{
		    					if (i > j)
		    					{
		    						a = i;
		    					}
		    					else
		    					{
		    						a = sj.getSiguienteJugador(i);
		    					}
		    					
		    				}
		    		}    			
		    	}
	        }
	        else
	        {
	        	a = sj.getSiguienteJugador(j);
	        }
	    	
	    	return a;
	    }
	    
	    private int heuristica(SituacionJugadores sj, int x, int y){
	        int nHeu=y*5-x*100;
	        Point jugadores[]=sj.getMisJugadores();
	        for (int n=0;n<11;n++){
	            int nDis=(int)(General.getDistancia(x,y,jugadores[n].getX(), jugadores[n].getY()));
	            if (nDis<70)
	                nHeu-=1000;
	        }
	        
	        Point contrarios[]=sj.getContrario();
	        for (int n=0;n<11;n++){
	            int nDis=(int)(General.getDistancia(x,y,contrarios[n].getX(), contrarios[n].getY()));
	            if (nDis<70)
	                nHeu+=1000;
	        }
	        return nHeu;
	    }
	    
	    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
	        //Point bola = sj.getBola();
	        int nHeuMejor=9999999;
	        int xMej=0, yMej=0;
	        int x=0, y=0, nHeu;
	        for (int n=0;n<70;n++){
	            x=(int)(Math.random()*340)-170;
	            y=(int)(Math.random()*240)-120;
	            nHeu=heuristica(sj,x,y);
	            if (nHeuMejor>nHeu){
	                nHeuMejor=nHeu;
	                xMej=x;
	                yMej=y;
	            }
	        }
	        
	        Point jugadores[]=sj.getMisJugadores();
	        for (int n=0;n<11;n++){
	            if (jugadores[n].getX()>50)
	                com.add(new ComandoTiroAPuerta(n,15));
	            else
	                com.add(new ComandoGolpearBola(n,xMej, yMej));
	                
	        }
	    }
	    
	}
